package com.neusoft.liduan.d0917;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.neusoft.liduan.d0901.Student;

public class Map集合 {
	/*	Map：键值对的结构，key-value。类似现实生活中查字典，key是Set集合，Value是Collection集合
	 * 		key是Set集合，那么不可以重复，value是List集合，可以重复，key允许有null值，但只有一个
	 * 		优势在于可以快速获取指定的数据，通过key就可以获取value
	 * 		而Set集合，只能通过遍历和比较才可以查询出指定数据
	 * 		List集合，可以通过遍历和比较才可以查询出指定数据，也可以通过位置获取
	 * 		通常在开发中，如果想通过某个对象的属性值来获取对象，那么就可以使用Map
	 * 		常用方法
	 * 			boolean containsKey(Object key);是否包含指定的key
	 * 			boolean containsValue(Object value);
	 * 			V get(Object key);通过key获取value
	 * 			V put(K key, V value);添加数据
	 * 			V remove(Object key);根据key删除value，key也会被删除，返回删除的value
	 * 			void putAll(Map<? extends K, ? extends V> m);
	 * 			Set<K> keySet();获取map的Set集合，获取所有的key
	 * 			Set<Map.Entry<K, V>> entrySet();获取Set的集合键值对
	 * 			V getOrDefault(Object key, V defaultValue)：当key不存在时，返回defaultValue
	 * 			V putIfAbsent(K key, V value)：如果没有key，则添加，有则返回该key对应的value
	 * 			boolean remove(Object key, Object value)：根据key和value来删除
	 * 			boolean replace(K key, V oldValue, V newValue)
	 * 			V replace(K key, V value)
	 * 			V merge(K key, V newvalue,BiFunction<? super V, ? super V, ? extends V> remappingFunction) 
	 * 				判断key是否存在，如果有那么将value和newvalue，通过remappingFunction函数来完成对应的操作
	 *	实现类：
	 *		HashMap：不支持同步，效率要高一点
	 *		HashTable：支持同步，效率差一点，不支持null
	 *			Properties：与IO中的.properties文件对应
	 *	Cloneable：复制
	 *	抽象类一般是定义一个模板，接口一般是对类做一个扩展作用
	 * 	Serializable：序列化，只是一个接口。由虚拟做相应的处理，与之相反的叫做反序列化。在IO中会演示
	 * 	Stream流操作，JDK1.8才有的，主要是用于集合的操作
	 * 	栈：先进后出
	 * 	队列：先进先出
	 * 	工具类：Collections
	 * 		copy(List<? super T> dest, List<? extends T> src) ：复制
	 * 		max(Collection<? extends T> coll) 
	 * 		reverse(List<?> list) 
	 * 		singleton(T o) 返回一个只包含指定对象的不可变集。 
	 * 		sort(List<T> list) 
	 */
	
	public static void main(String[] args) {
		t1();
	}
	
	public static void t1() {
		Map map = new HashMap();//接口的多态写法
		HashMap hm = new HashMap();
		map.put("haha", "张三");
		map.put(1, "李四");
		map.put("hehe", new Student());
		map.put(null, null);
		map.put(null, 1);//修改
		System.out.println(map.size());
		System.out.println(map);
		System.out.println(map.remove(null));
		System.out.println(map);
		System.out.println(map.get(1));
		System.out.println(map.get(2));
		System.out.println(map.getOrDefault(2, "没有该key的值"));
		//如果基本数据类型，可以使用getOrDefault来给默认值
		int i = (int) map.getOrDefault(2, 100);
		String s = (String) map.getOrDefault("s", "");
//		String s = (String) map.get("s");
		System.out.println(s.equals("s"));
		/*
		 * 	遍历
		 * 		1、只要遍历key
		 * 		2、只要遍历value
		 * 		3、遍历key和value
		 */
		//获取所有key
		Set keySet = map.keySet();
		//获取所有的值
//		Collection values = map.values();
		//Collection的遍历只能通过迭代器
//		ArrayList list = (ArrayList) values;
//		System.out.println(list);
		Iterator it = keySet.iterator();
		while(it.hasNext()) {
			Object key = it.next();
			Object value = map.get(key);
		}
		
		map.merge(2, 20, (oldVal, newVal) -> Integer.valueOf(oldVal.toString()) + Integer.valueOf(newVal.toString()));//JDK8模仿js提供高阶函数效果
		map.merge(2, 30, (oldVal, newVal) -> Integer.valueOf(oldVal.toString()) + Integer.valueOf(newVal.toString()));
		map.merge(2, 3, (oldVal, newVal) -> Integer.valueOf(oldVal.toString()) * Integer.valueOf(newVal.toString()));
		System.out.println(map);
		
		
	}
	
	public static void t2() {
		Hashtable table = new Hashtable();
		table.put(null, null);//Hashtable不允许有null值，其它都和Hashmap差不多
	}
	
}
